package com.lagou.module4hw.hw3;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 使用线程池将一个目录中的所有内容拷贝到另外一个目录中，包含子目录中的内容
 */
public class CopyFileThreadPoolTest {

    //用于存放所有目录的list
    public static ArrayList<StringBuilder> dirList = new ArrayList<>();
    //定义要复制的源目录和目标目录
    public static StringBuilder src =  new StringBuilder("G:\\LADOU\\预科班\\模块四\\模块三 Java核心类库（上）2");
    public static StringBuilder dest = new StringBuilder("G:\\LADOU\\预科班\\模块四\\模块三 Java核心类库（上）3");

    public static void main(String[] args) {

        //1.统计目录中有多少个子目录
        int count = subDirCount(src.toString(),dest.toString());
        if( -1 == count){
            System.out.println("目录不存在");
        }else {
            //调用线程池复制子目录中的所有内容
            CopyFileThreadPool(count+1);
        }
        return;
    }

    /**
     * 创建线程池复制目录
     * @param count 线程的个数
     */
    private static void CopyFileThreadPool(int count) {
        //1.创建指定数量的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(count);

        //2.提交任务
        boolean flag = true;
        for(int i = 0; i < count; i++){
            if( i > 0 ) flag = false;
            //拼接src目录和dest目录
            String srcDir = dirList.get(i).toString();
            String descDir = dirList.get(i).replace(0,src.length(),dest.toString()).toString();

            //用HashMap存储src目录和dest目录
            HashMap<String, String> dir =  new HashMap<String, String>();
            dir.put(srcDir,descDir);

            //提交多线程任务,copyFileRunnable线程执行类对象
            CopyFileRunnableImpl copyFileRunnable =
                   new CopyFileRunnableImpl(dir, flag);
            executorService.submit(copyFileRunnable);
        }

        //3.关闭线程池
        executorService.shutdown();
    }

    /**
     * 统计目录中子目录的个数
     * @param src 源目录  dest 目标目录
     * @return 子目录的个数
     */
    private static int subDirCount(String src,String dest) {
        File file = new File(src);
        if( !file.exists() ){    //源目录不存在
            return -1;
        }

        File file2 = new File(dest);
        if( !file2.exists()){   //目标目录不存在,创建dest目录
            file2.mkdir();
        }

        //file.toString()方法返回的是全路径的字符串
        dirList.add(new StringBuilder(file.toString()));

        //统计并返回目录中子目录的个数
        File[] files = file.listFiles();
        int count = 0;
        for(File subFile : files){
            if ( subFile.isDirectory() ) {
                count++;
                //System.out.println(subFile.g);
                dirList.add(new StringBuilder(subFile.toString()));   //把子目录，添加到List中
            }
        }
        return count;
    }
}
